本文共 1883 字,大约阅读时间需要 6 分钟。
客户端:
import structimport socketphone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.connect(('127.0.0.1',9909))while True: # 1:发命令 cmd=input('>>:').strip()#dir if not cmd:continue phone.send(cmd.encode('utf-8')) # 2:拿命令的结果,并打印 #第一步:先收报头 header=phone.recv(4) # 第二步:从报头中解析出来对真实数据的描述信息(数据的长度) total_size=struct.unpack('i',header)[0] #第三步:接收真实的数据 recv_size=0 recv_data=b'' #循环接收数据,直到接收完全部数据跳出循环 while recv_size
服务端:
import socketimport subprocessimport structphone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.bind(('127.0.0.1',9909))phone.listen(5)print('starting..')while True:#链接循环 conn,client_addr=phone.accept() print(client_addr) while True: try: #1:收命令 cmd=conn.recv(8096) if not cmd:break#适用于linux操作系统 # 2:执行命令,拿到结果 # subprocess.Popen通过它可以来创建进程,并与其进行复杂的交互 # cmd:标准像子进程传入需要执行的shell命令,如:ls - al # # subprocess.PIPE:在创建Popen对象时,subprocess.PIPE可以初始化为stdin, stdout或stderr的参数,表示与子进程通信的标准输入流,标准输出流以及标准错误。 # # subprocess.STDOUT:作为Popen对象的stderr的参数,表示将标准错误通过标准输出流输出。 obj=subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) stdout=obj.stdout.read() stderr=obj.stderr.read() # 3:把命令的结果返回给客户端 # 第一步:制作固定长度的报头 total_size=len(stdout)+len(stderr) header=struct.pack('i',total_size) # 第二步:把报头发送给客户端 conn.send(header) # 第三步:在发送真实的数据 conn.send(stdout) conn.send(stdout) # 适用于Windows操作系统 except ConnectionResetError: break conn.close()phone.close()
1:先启动服务端,在从客户端传入数据:
服务端:转载地址:http://fpyg.baihongyu.com/